package router

import (
	"fmt"
	"github.com/gofiber/fiber/v2"
	"sg-backend/app/analyse"
	"sg-backend/app/income"
	"sg-backend/app/lend"
	lendPaybackLog "sg-backend/app/lend/paybackLog"
	"sg-backend/app/owe"
	owePaybackLog "sg-backend/app/owe/paybackLog"
	"sg-backend/app/paySetting/family"
	"sg-backend/app/paySetting/icon"
	"sg-backend/app/paySetting/income"
	"sg-backend/app/paySetting/payment"
	"sg-backend/app/payment"
	paymentRefund "sg-backend/app/payment/refund"
	"sg-backend/app/test"
	"sg-backend/app/user/dblog"
	"sg-backend/app/user/files"
	"sg-backend/app/user/list"
	"sg-backend/app/user/login"
	"sg-backend/app/user/menu"
	"sg-backend/app/user/menuNav"
	"sg-backend/app/user/password"
	"sg-backend/app/user/perms"
	"sg-backend/app/user/userInfo"
	"sg-backend/middleware"
)

func AppRouter(app *fiber.App) {

	/*
	 * 免登录使用的路由
	 * 1，登录路由
	 * 2，匿名功能路由
	 */
	app.Post("/api/user/login", login.PasswordLogin)
	app.Post("/api/user/verityCode", password.SendVerityCode)       // 用户通过邮箱获取验证码
	app.Post("/api/user/recoverPassword", password.RecoverPassword) // 用户通过邮箱找回重置密码

	/*
	 * 需要登录验证的路由，写在此行以下
	 * 在此行之下的，包括app.GET/POST/DELETE/PUT都需要认证授权
	 */
	api := app.Group("/api", middleware.AuthMiddleware())

	// 媒体文件路由
	app.Static("/media", "./media")
	app.Static("/static", "./static")

	// 上传路由
	api.Post("/upload", files.UploadFile) // 上传文件接口

	// 测试路由
	api.Get("/test", test.Test)

	/*
	 * 1 系统管理路由
	 */

	users := api.Group("/user")

	// 1.0 基础公共api
	users.Get("/nav", menuNav.GetMenuNav)                    // 获取导航菜单
	users.Get("/info", userInfo.GetUserInfo)                 // 获取登录用户基础信息
	users.Put("/selfUpdate", userInfo.SelfUpdate)            // 用户自助修改基础信息
	users.Post("/firstLogin", login.FirstLoginChangPassword) // 初次登录强制修改密码接口
	users.Post("/outLogin", login.OutLogin)                  // 用户主动退出登录
	users.Post("/changePassword", password.ChangePassword)   // 用户修改密码

	// 1.1 菜单管理
	users.Get("/menu", menu.GetMenu)       // 获取菜单
	users.Post("/menu", menu.AddMenu)      // 新增菜单
	users.Put("/menu", menu.UpdateMenu)    // 修改菜单
	users.Delete("/menu", menu.DeleteMenu) // 删除菜单

	// 1.3 用户账号管理
	users.Get("/item", list.GetUserItem)   // 查询获取用户列表，提供给前端select
	users.Get("/list", list.GetUserList)   // 查询获取用户列表
	users.Post("/list", list.AddUser)      // 新增用户账号
	users.Put("/list", list.UpdateUser)    // 修改用户账号
	users.Delete("/list", list.DeleteUser) // 禁用用户账号

	// 1.5 日志管理
	users.Get("/logs", dblog.GetLog)       // 获取日志记录
	users.Delete("/logs", dblog.DeleteLog) // 删除日志记录

	// 1.6 附件管理
	users.Get("/files", files.GetFiles) // 获取所有附件

	// 1.7 权限管理
	users.Get("/userPerms", perms.UserPerm)       // 获取指定用户的权限
	users.Put("/userPerms", perms.UpdateUserPerm) // 更新指定用户的权限

	/**
	2，应用基础设置
	*/
	setting := api.Group("/setting")
	setting.Get("/family", familySetting.GetFamilyType)       // 获取家庭成员
	setting.Post("/family", familySetting.AddFamilyType)      // 新增家庭成员
	setting.Put("/family", familySetting.UpdateFamilyType)    // 更新家庭成员
	setting.Delete("/family", familySetting.DeleteFamilyType) // 删除家庭成员
	setting.Get("/income", incomeSetting.GetIncomeType)       // 获取收入分类
	setting.Post("/income", incomeSetting.AddIncomeType)      // 新增收入分类
	setting.Put("/income", incomeSetting.UpdateIncomeType)    // 更新收入分类
	setting.Delete("/income", incomeSetting.DeleteIncomeType) // 删除收入分类
	setting.Get("/payment", paySetting.GetPaymentType)        // 获取支出分类
	setting.Post("/payment", paySetting.AddPaymentType)       // 新增支出分类
	setting.Put("/payment", paySetting.UpdatePaymentType)     // 更新支出分类
	setting.Delete("/payment", paySetting.DeletePaymentType)  // 删除支出分类
	setting.Get("/allIcon", icon.GetAllIcon)                  // 获取所有Icon

	/**
	 * 支出管理
	 */
	api.Get("/paymentLog", payment.GetPaymentLog)                // 获取支出流水
	api.Post("/paymentLog", payment.AddPaymentLog)               // 新增支出流水
	api.Put("/paymentLog", payment.UpdatePaymentLog)             // 修改支出流水
	api.Put("/paymentLog/refund", paymentRefund.UpdatePayRefund) // 登记支出流水退款
	api.Delete("/paymentLog", payment.DeletePaymentLog)          // 删除支出流水

	/**
	 * 收入管理
	 */
	api.Get("/incomeLog", income.GetIncomeLog)       // 获取收入流水
	api.Post("/incomeLog", income.AddIncomeLog)      // 新增收入流水
	api.Put("/incomeLog", income.UpdateIncomeLog)    // 修改收入流水
	api.Delete("/incomeLog", income.DeleteIncomeLog) // 删除收入流水

	/**
	 * 借入管理
	 */
	api.Get("/oweLog", owe.GetOweLog)                                   // 获取借入流水
	api.Post("/oweLog", owe.AddOweLog)                                  // 新增借入流水
	api.Put("/oweLog", owe.UpdateOweLog)                                // 修改借入流水
	api.Delete("/oweLog", owe.DeleteOweLog)                             // 删除借入流水
	api.Get("/oweLog/paybackLog", owePaybackLog.GetOwePaybackLog)       // 获取借入的还钱流水
	api.Post("/oweLog/paybackLog", owePaybackLog.AddLendPaybackLog)     // 添加借入的钱的还钱记录
	api.Delete("/oweLog/paybackLog", owePaybackLog.DeleteOwePaybackLog) // 删除借入的钱的还钱记录

	/**
	 * 借出管理
	 */
	api.Get("/lendLog", lend.GetLendLog)                                   // 获取借出流水
	api.Post("/lendLog", lend.AddLendLog)                                  // 新增借出流水
	api.Put("/lendLog", lend.UpdateLendLog)                                // 修改借出流水
	api.Delete("/lendLog", lend.DeleteLendLog)                             // 删除借出流水
	api.Get("/lendLog/paybackLog", lendPaybackLog.GetLendPaybackLog)       // 获取借出的还钱记录
	api.Post("/lendLog/paybackLog", lendPaybackLog.AddLendPaybackLog)      // 添加借出的还钱记录
	api.Delete("/lendLog/paybackLog", lendPaybackLog.DeleteLendPaybackLog) // 删除借出的还钱记录

	/**
	 * 获取汇总分析数据
	 */
	api.Get("/analyse/totalData", analyse.GetTotalData)                             // 根据年份获取汇总数据
	api.Get("/analyse/thisWeekData", analyse.GetThisWeekPayAndIncomeData)           // 获取本周汇总数据
	api.Get("/analyse/incomePieData", analyse.GetIncomePieData)                     // 获取年度收入分类数据
	api.Get("/analyse/monthIncomePieData", analyse.GetMonthlyIncomePieData)         // 获取选定月份收入分类数据
	api.Get("/analyse/paymentPieData", analyse.GetYearPayPieData)                   // 获取年度支出分类数据
	api.Get("/analyse/familyPaymentPieData", analyse.GetYearFamilyPayPieData)       // 获取家庭成员年度支出数据
	api.Get("/analyse/monthPaymentPieData", analyse.GetMonthPayPieData)             // 获取选定月份支出分类数据
	api.Get("/analyse/monthFamilyPaymentPieData", analyse.GetFamilyMonthPayPieData) // 获取选定月份家庭成员支出数据
	api.Get("/analyse/monthPayAndIncomeData", analyse.GetMonthPayAndIncomeData)     // 获取选定月份支出收入数据
	api.Get("/analyse/yearPayAndIncomeData", analyse.GetThisYearPayAndIncomeData)   // 获取选定年份支出收入数据

	// 404返回
	app.Use(func(c *fiber.Ctx) error {
		errMsg := fmt.Sprintf("【%s】请求的资源：%s 不存在！", c.Method(), c.Request().URI())
		return c.Status(fiber.StatusNotFound).JSON(fiber.Map{
			"success":      false,
			"errorMessage": errMsg,
		})
	})
}
